// 用指针写一个链表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "head.h"

typedef struct std
{
    int data;         // 数据
    struct std *next; // 结构体嵌套自己   地址
} std;

std *list_init()
{
    // 为节点创建一片空间
    std *s1 = (std *)malloc(sizeof(std));

    if (NULL == s1)
    {
        ERRLOG("创建内存失败");
        return NULL;
    }

    // 为s1 初始化内容
    s1->data = 10;
    s1->next = NULL;

    return s1;
}

// 增 <尾插>  头 数据
void list_add(std *list, std data)
{
    // 安全判定
    if (NULL == list)
    {
        ERRLOG("传入链表为空");
        return;
    }

    // 开始插入   <只有一个头节点>
    if (NULL == list->next)
    {
        // 1.创建一片空间A
        std *new_std = (std *)malloc(sizeof(std));

        // 2.为这片空间A写入数据
        *new_std = data;

        // 4.将新空间的 next 指向 空
        new_std->next = NULL;

        // 3.将空间A 的地址 给 list->next
        list->next = new_std;
    }



}

int main(int argc, char const *argv[])
{
    std *list = list_init();

    // 插入数据
    std data = {.data = 20, .next = NULL};

    list_add(list , data);

    // 数据打印
    // 创建一个指针
    std *print_ptr = list;

    for (size_t i = 0; NULL != print_ptr; i++)
    {
        // 打印
        printf("data = %d\n", print_ptr->data);

        // 让 print_ptr  指向下一个数据
        print_ptr = print_ptr->next;
    }

    // 释放空间
    std *free_ptr_1 = list->next;
    std *free_ptr_2 = list;

    for ( size_t i = 0 ; NULL != free_ptr_2 ; i++ )
    {
        // 释放空间
        free(free_ptr_2);

        // 指针移动
        free_ptr_2 = free_ptr_1;
        
        // 如果 free_ptr_2 or free_ptr_1  在此刻已经等于NULL 了则 退出循环
        if (NULL == free_ptr_2)
        {
            break;
        }

        // 移动 free_ptr_1 指针
        free_ptr_1 = free_ptr_1->next;

    }

    list = NULL;

    return 0;
}
